/* USER CODE BEGIN Header */
/**
  ******************************************************************************

  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* 变量定义 */
TIM_HandleTypeDef htim3;          // TIM3 PWM控制器
uint16_t pwmVal = 0;              // PWM占空比（0-499）
uint8_t fadeSpeed = 5;            // 呼吸速度（值越大变化越快）

/* 函数声明 */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);

int main(void) {
    /* 初始化 */
    HAL_Init();
    SystemClock_Config();         // 配置系统时钟为64MHz
    MX_GPIO_Init();               // 启用GPIOB时钟
    MX_TIM3_Init();               // 初始化TIM3 PWM
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);  // 启动PWM输出

    /* 主循环 */
    while (1) {
        /* 呼吸灯效果 */
        while (pwmVal < 500) {    // 渐亮
            pwmVal += fadeSpeed;
                    __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, pwmVal);
            HAL_Delay(10);
        }
        while (pwmVal > 0) {      // 渐暗
            pwmVal -= fadeSpeed;
                    __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, pwmVal);
            HAL_Delay(10);
        }
        HAL_Delay(200);           // 呼吸间隔
    }
}

/**
  * @brief TIM3初始化（PWM频率=64MHz/(64*500)=2kHz）
  */
static void MX_TIM3_Init(void) {
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};

    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 64 - 1;      // 分频后时钟=1MHz
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 500 - 1;        // PWM周期=500
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim3);

    /* PWM通道4配置 */
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 0;                // 初始占空比0%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;  // 高电平有效
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4);

    HAL_TIM_MspPostInit(&htim3);        // 自动配置复用功能
}

/**
  * @brief GPIO初始化（激活PB1的TIM3_CH4复用功能）
  */
static void MX_GPIO_Init(void) {
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_TIM3_CLK_ENABLE();
}

/**
  * @brief 系统时钟配置（HSI 16MHz→PLL 64MHz）
  */
void SystemClock_Config(void) {
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;  // 16MHz*16/2=64MHz
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}